home *** CD-ROM | disk | FTP | other *** search
File List | 1997-05-10 | 20.3 KB | 547 lines |
- #PIC V0.9.2 (c)1997 J.Petroglou LIST FILE
- #file: data:aminetupp/PICSim/examples/Amikeyterm.src
- #date: Sat May 10 15:11:49 1997
- #pic : PIC16C84
-
- ADDR CODE SRCLINE SOURCECODE
-
- 0000 000001
- 0000 000002
- 0000 000003 ;PIC16C84 keybord controller for Amiga keybords
- 0000 000004 ;pressed keys are located in table and send in serial ascii format (19200baud)
- 0000 000005 ;
- 0000 000006 ;Dirk Duesterberg duesterb@unixserv.rz.fh-hannover.de
- 0000 000007 ; http://linux.rz.fh-hannover.de/~duesterb
- 0000 000008
- 0000 000009
- 0000 000010 list p=PIC16C84, r=dec, s=off
- 0000 000011
-
- #include 'ram:p16cxx.inc' start
- 0000 000001 LIST
- 0000 000002 ; P16CXX.INC Standard PICAsm Header File
- 0000 000070 LIST
- #include end.
-
- 0000 000013
- 0000 000014
- 0000 000015 #define ACLK PortA,0
- 0000 000016 #define ADAT PortA,1
- 0000 000017
- 0000 000018 #define TXD PortA,2
- 0000 000019 #define c 3,0
- 0000 000020 #define z 3,2
- 0000 000021
- 0000 000022 RA = 5 ;PortA is register 5
- 0000 000023
- 0000 000024
- 0000 000025
- 0000 000026
- 0000 000027 CBLOCK 0ch
- 0000 000028
- 0000 000028
- 0000 000029 count0
- 0000 000030 count1
- 0000 000031 Akeydat
- 0000 000032 serbuf
- 0000 000033
- 0000 000033
- 0000 000034 ENDC
- 0000 000035
- 0000 000036
- 0000 000037
- 0000 30FB 000038 movlw 11111011b ;pin 2 is output (TXD)
- 0001 0065 000039 tris PortA
- 0002 000040
- 0002 3000 000041 movlw 0 ;PortB is output
- 0003 0066 000042 tris PortB
- 0004 000043
- 0004 2888 000044 goto Reset
- 0005 000045
- 0005 000046
- 0005 000047
- 0005 080E 000048 rawkeys movf Akeydat,w
- 0006 397F 000049 andlw 7fh ;clr bit 7 (make/break or pressed/unpressed)
- 0007 0782 000050 addwf pcl,f
- 0008 000051
- 0008 000052
- 0008 000053 ; characters, numbers and spezial keys
- 0008 000054 ; $00-$3F
- 0008 000055
- 0008 3400 000056 retlw 00h ;00h
- 0009 3400 000057 retlw 00h ;01h
- 000A 3400 000058 retlw 00h ;02h
- 000B 3400 000059 retlw 00h ;03h
- 000C 3400 000060 retlw 00h ;04h
- 000D 3400 000061 retlw 00h ;05h
- 000E 3400 000062 retlw 00h ;06h
- 000F 3400 000063 retlw 00h ;07h
- 0010 000064
- 0010 3400 000065 retlw 00h ;08h
- 0011 3400 000066 retlw 00h ;09h
- 0012 3400 000067 retlw 00h ;0Ah
- 0013 3400 000068 retlw 00h ;0Bh
- 0014 3400 000069 retlw 00h ;0Ch
- 0015 3400 000070 retlw 00h ;0Dh
- 0016 3400 000071 retlw 00h ;0Eh
- 0017 3400 000072 retlw 00h ;0Fh
- 0018 000073
- 0018 000074
- 0018 000075
- 0018 3471 000076 retlw "q" ;10h
- 0019 3477 000077 retlw "w" ;11h
- 001A 3465 000078 retlw "e" ;12h
- 001B 3472 000079 retlw "r" ;13h
- 001C 3474 000080 retlw "t" ;14h
- 001D 347A 000081 retlw "z" ;15h
- 001E 3475 000082 retlw "u" ;16h
- 001F 3469 000083 retlw "i" ;17h
- 0020 000084
- 0020 346F 000085 retlw "o" ;18h
- 0021 3470 000086 retlw "p" ;19h
- 0022 FFFFFFFC 000087 retlw "ü" ;1Ah
- 0023 342B 000088 retlw "+" ;1Bh
- 0024 3400 000089 retlw 00h ;1Ch
- 0025 3400 000090 retlw 00h ;1Dh
- 0026 3400 000091 retlw 00h ;1Eh
- 0027 3400 000092 retlw 00h ;1Fh
- 0028 000093
- 0028 000094
- 0028 000095
- 0028 3461 000096 retlw "a" ;20h
- 0029 3473 000097 retlw "s" ;21h
- 002A 3464 000098 retlw "d" ;22h
- 002B 3466 000099 retlw "f" ;23h
- 002C 3467 000100 retlw "g" ;24h
- 002D 3468 000101 retlw "h" ;25h
- 002E 346A 000102 retlw "j" ;26h
- 002F 346B 000103 retlw "k" ;27h
- 0030 000104
- 0030 346C 000105 retlw "l" ;28h
- 0031 FFFFFFF6 000106 retlw "ö" ;29h
- 0032 FFFFFFE4 000107 retlw "ä" ;2Ah
- 0033 3400 000108 retlw 00h ;2Bh
- 0034 3400 000109 retlw 00h ;2Ch
- 0035 3400 000110 retlw 00h ;2Dh
- 0036 3400 000111 retlw 00h ;2Eh
- 0037 3400 000112 retlw 00h ;2Fh
- 0038 000113
- 0038 000114
- 0038 000115
- 0038 3400 000116 retlw 00h ;30h
- 0039 3400 000117 retlw 00h ;31h
- 003A 3400 000118 retlw 00h ;32h
- 003B 3400 000119 retlw 00h ;33h
- 003C 3400 000120 retlw 00h ;34h
- 003D 3400 000121 retlw 00h ;35h
- 003E 3400 000122 retlw 00h ;36h
- 003F 3400 000123 retlw 00h ;37h
- 0040 000124
- 0040 3400 000125 retlw 00h ;38h
- 0041 3400 000126 retlw 00h ;39h
- 0042 3400 000127 retlw 00h ;3Ah
- 0043 3400 000128 retlw 00h ;3Bh
- 0044 3400 000129 retlw 00h ;3Ch
- 0045 3400 000130 retlw 00h ;3Dh
- 0046 3400 000131 retlw 00h ;3Eh
- 0047 3400 000132 retlw 00h ;3Fh
- 0048 000133
- 0048 000134 ; other spezial keys (space, TAB, Return)
- 0048 000135 ; $40-$4F
- 0048 000136
- 0048 3400 000137 retlw 00h ;40h
- 0049 3400 000138 retlw 00h ;41h
- 004A 3400 000139 retlw 00h ;42h
- 004B 3400 000140 retlw 00h ;43h
- 004C 3400 000141 retlw 00h ;44h
- 004D 3400 000142 retlw 00h ;45h
- 004E 3400 000143 retlw 00h ;46h
- 004F 3400 000144 retlw 00h ;47h
- 0050 000145
- 0050 3400 000146 retlw 00h ;48h
- 0051 3400 000147 retlw 00h ;49h
- 0052 3400 000148 retlw 00h ;4Ah
- 0053 3400 000149 retlw 00h ;4Bh
- 0054 3400 000150 retlw 00h ;4Ch
- 0055 3400 000151 retlw 00h ;4Dh
- 0056 3400 000152 retlw 00h ;4Eh
- 0057 3400 000153 retlw 00h ;4Fh
- 0058 000154
- 0058 000155
- 0058 000156 ; Function keys, Help etc.
- 0058 000157 ; $50-$5F
- 0058 000158
- 0058 3400 000159 retlw 00h ;50h
- 0059 3400 000160 retlw 00h ;51h
- 005A 3400 000161 retlw 00h ;52h
- 005B 3400 000162 retlw 00h ;53h
- 005C 3400 000163 retlw 00h ;54h
- 005D 3400 000164 retlw 00h ;55h
- 005E 3400 000165 retlw 00h ;56h
- 005F 3400 000166 retlw 00h ;57h
- 0060 000167
- 0060 3400 000168 retlw 00h ;58h
- 0061 3400 000169 retlw 00h ;59h
- 0062 3400 000170 retlw 00h ;5Ah
- 0063 3400 000171 retlw 00h ;5Bh
- 0064 3400 000172 retlw 00h ;5Ch
- 0065 3400 000173 retlw 00h ;5Dh
- 0066 3400 000174 retlw 00h ;5Eh
- 0067 3400 000175 retlw 00h ;5Fh
- 0068 000176
- 0068 000177
- 0068 000178
- 0068 000179 ; shifting keys like shift, amiga, Alternate and Control
- 0068 000180 ; $60-6F
- 0068 000181
- 0068 3400 000182 retlw 00h ;60h
- 0069 3400 000183 retlw 00h ;61h
- 006A 3400 000184 retlw 00h ;62h
- 006B 3400 000185 retlw 00h ;63h
- 006C 3400 000186 retlw 00h ;64h
- 006D 3400 000187 retlw 00h ;65h
- 006E 3400 000188 retlw 00h ;66h
- 006F 3400 000189 retlw 00h ;67h
- 0070 000190
- 0070 3400 000191 retlw 00h ;68h
- 0071 3400 000192 retlw 00h ;69h
- 0072 3400 000193 retlw 00h ;6Ah
- 0073 3400 000194 retlw 00h ;6Bh
- 0074 3400 000195 retlw 00h ;6Ch
- 0075 3400 000196 retlw 00h ;6Dh
- 0076 3400 000197 retlw 00h ;6Eh
- 0077 3400 000198 retlw 00h ;6Fh
- 0078 000199
- 0078 000200
- 0078 000201 ;spezial keybord commandos
- 0078 000202 ; $70-$7F
- 0078 000203
- 0078 3400 000204 retlw 00h ;70h
- 0079 3400 000205 retlw 00h ;71h
- 007A 3400 000206 retlw 00h ;72h
- 007B 3400 000207 retlw 00h ;73h
- 007C 3400 000208 retlw 00h ;74h
- 007D 3400 000209 retlw 00h ;75h
- 007E 3400 000210 retlw 00h ;76h
- 007F 3400 000211 retlw 00h ;77h
- 0080 000212
- 0080 3400 000213 retlw 00h ;78h
- 0081 3400 000214 retlw 00h ;79h=F9h= letzter tasten code war fehlerhaft
- 0082 3400 000215 retlw 00h ;7Ah=FAh= tastenpuffer im keybord voll
- 0083 3400 000216 retlw 00h ;7Bh
- 0084 3400 000217 retlw 00h ;7Ch=FCh= selbsttest der tastatur war fehlerhaft
- 0085 3400 000218 retlw 00h ;7Dh=FDh= beginn der beim Einschalten gedrueckten Tasten
- 0086 3400 000219 retlw 00h ;7Eh=FEh= ende der beim Einschalten gedrueckten Tasten
- 0087 3400 000220 retlw 00h ;7Fh
- 0088 000221
- 0088 000222
- 0088 000223
- 0088 000224
- 0088 000225
- 0088 000226
- 0088 000227
- 0088 000228
- 0088 000229
- 0088 000230
- 0088 000231
- 0088 000232
- 0088 000233
- 0088 000234
- 0088 000235
- 0088 000236
- 0088 000237
- 0088 000238
- 0088 000239
- 0088 000240
- 0088 000241
- 0088 000242
- 0088 000243
- 0088 000244
- 0088 018E 000245 Reset clrf Akeydat ;Akeydat is used as character counter
- 0089 000246
- 0089 300B 000247 check movlw 11
- 008A 020E 000248 subwf Akeydat,w ;how many characters ?
- 008B 1903 000249 btfsc z
- 008C 289F 000250 goto ready
- 008D 000251
- 008D 2092 000252 call dat
- 008E 008F 000253 movwf serbuf
- 008F 20D6 000254 call sendb ;send letter
- 0090 0A8E 000255 incf Akeydat,f
- 0091 2889 000256 goto check
- 0092 000257
- 0092 000258
- 0092 000259
- 0092 080E 000260 dat movf Akeydat,w ;letter to w routine
- 0093 0782 000261 addwf pcl,f ;jump in table
- 0094 346D 000262 retlw "mache RESET"
- 0095 3461 000262
- 0096 3463 000262
- 0097 3468 000262
- 0098 3465 000262
- 0099 3420 000262
- 009A 3452 000262
- 009B 3445 000262
- 009C 3453 000262
- 009D 3445 000262
- 009E 3454 000262
- 009F 000263
- 009F 000264
- 009F 000265
- 009F 000266
- 009F 000267
- 009F 000268
- 009F 000269
- 009F 20B2 000270 ready call sync
- 00A0 000271
- 00A0 000272
- 00A0 000273
- 00A0 000274
- 00A0 3007 000275 rcAdat movlw 7
- 00A1 008C 000276 movwf count0
- 00A2 000277
- 00A2 20CD 000278 :loop call wACLK ;wait for Amiga CLK
- 00A3 0D8E 000279 rlf Akeydat,f ;rotate bits into register
- 00A4 0B8C 000280 decfsz count0,f
- 00A5 28A2 000281 goto :loop ;format is x6543210
- 00A6 000282
- 00A6 000283
- 00A6 0D8E 000284 rlf Akeydat,f ;format is 6543210x
- 00A7 20CD 000285 call wACLK ;wait for Amiga CLK
- 00A8 0C8E 000286 rrf Akeydat,f ;format is 76543210, jippije
- 00A9 098E 000287 comf Akeydat,f ;data is inverted
- 00AA 000288
- 00AA 3005 000289 movlw 5
- 00AB 20BA 000290 call wms ;wait 5 ms
- 00AC 000291
- 00AC 000292 ; mov serbuf,Akeydat
- 00AC 000293 ; call sendb ;send raw data
- 00AC 000294
- 00AC 000295
- 00AC 2005 000296 call rawkeys
- 00AD 008F 000297 movwf serbuf
- 00AE 000298
- 00AE 1F8E 000299 btfss Akeydat,7 ;no sending if key up flag is set
- 00AF 20D6 000300 call sendb ;send the in table found code
- 00B0 000301
- 00B0 20C3 000302 call AHshake ;all data OK, do the Handshake
- 00B1 28A0 000303 goto rcAdat ;receive next byte from keybord
- 00B2 000304
- 00B2 000305
- 00B2 000306
- 00B2 000307
- 00B2 000308
- 00B2 000309
- 00B2 000310
- 00B2 000311
- 00B2 000312
- 00B2 000313
- 00B2 000314
- 00B2 20CD 000315 sync call wACLK ;wait for clock and do no Acknowledge
- 00B3 000316
- 00B3 30FA 000317 movlw 250
- 00B4 20BA 000318 call wms ;wait 250 ms (we want the sync mode!)
- 00B5 000319
- 00B5 20CD 000320 call wACLK ;wait for Amiga CLK for Handshake
- 00B6 000321
- 00B6 3001 000322 movlw 1
- 00B7 20BA 000323 call wms ;wait 1 ms
- 00B8 000324
- 00B8 20C3 000325 call AHshake ;now we do the shake!
- 00B9 0008 000326 return
- 00BA 000327
- 00BA 000328
- 00BA 000329
- 00BA 000330
- 00BA 000331
- 00BA 000332
- 00BA 008C 000333 wms movwf count0
- 00BB 000334
- 00BB 30F8 000335 :loop movlw 248
- 00BC 008D 000336 movwf count1
- 00BD 0000 000337 :do_it nop
- 00BE 000338
- 00BE 0B8D 000339 decfsz count1,f
- 00BF 28BD 000340 goto :do_it
- 00C0 000341
- 00C0 0B8C 000342 decfsz count0,f
- 00C1 28BB 000343 goto :loop
- 00C2 000344
- 00C2 0008 000345 return
- 00C3 000346
- 00C3 000347
- 00C3 000348
- 00C3 000349
- 00C3 000350
- 00C3 000351
- 00C3 30F9 000352 AHshake movlw 11111001b ;bit1 = ADAT = output
- 00C4 0065 000353 tris RA
- 00C5 000354
- 00C5 1085 000355 bcf ADAT ;clr Amiga data line
- 00C6 000356
- 00C6 3028 000357 movlw 40
- 00C7 008C 000358 movwf count0 ;40 * 3 = 120cycles = 120 µs (min 75µs)
- 00C8 0B8C 000359 :do_it decfsz count0,f
- 00C9 28C8 000360 goto :do_it
- 00CA 000361
- 00CA 30FB 000362 movlw 11111011b ;bit1 = ADAT = input
- 00CB 0065 000363 tris RA
- 00CC 0008 000364 return
- 00CD 000365
- 00CD 000366
- 00CD 000367
- 00CD 000368
- 00CD 000369
- 00CD 000370
- 00CD 1805 000371 wACLK btfsc ACLK ;wait for neg clock pulse
- 00CE 28CD 000372 goto wACLK
- 00CF 000373
- 00CF 1C85 000374 btfss Adat
- 00D0 1003 000375 bcf c
- 00D1 1885 000376 btfsc Adat
- 00D2 1403 000377 bsf c ;mov the data to carry bit
- 00D3 000378
- 00D3 1C05 000379 wACLK2 btfss ACLK ;wait for pos clock pulse
- 00D4 28D3 000380 goto wACLK2
- 00D5 0008 000381 return
- 00D6 000382
- 00D6 000383
- 00D6 000384
- 00D6 000385
- 00D6 000386
- 00D6 000387
- 00D6 000388
- 00D6 20E7 000389 sendb call wbit ;this are stop bits from previous sending
- 00D7 20E7 000390 call wbit
- 00D8 000391
- 00D8 1505 000392 bsf TXD ;send startbit
- 00D9 3008 000393 movlw 8
- 00DA 008C 000394 movwf count0 ;8 bits to send
- 00DB 098F 000395 comf serbuf,f ;invert serbuf
- 00DC 000396
- 00DC 20E7 000397 s_it call wbit
- 00DD 0C8F 000398 rrf serbuf,f
- 00DE 000399
- 00DE 1C03 000400 btfss c
- 00DF 1105 000401 bcf TXD
- 00E0 1803 000402 btfsc c
- 00E1 1505 000403 bsf TXD
- 00E2 000404
- 00E2 0B8C 000405 decfsz count0,f
- 00E3 28DC 000406 goto s_it ;all bits send ? decrement the bitcounter
- 00E4 000407
- 00E4 20E7 000408 call wbit
- 00E5 1105 000409 bcf TXD ;clear TXD, stopbit, lenght is defined by
- 00E6 000410 ;next sending
- 00E6 0008 000411 return
- 00E7 000412
- 00E7 000413
- 00E7 000414
- 00E7 000415
- 00E7 000416
- 00E7 300D 000417 wbit movlw 13
- 00E8 008D 000418 movwf count1 ;19200 at 4 Mhz
- 00E9 0B8D 000419 :loop decfsz count1,f
- 00EA 28E9 000420 goto :loop
- 00EB 0000 000421 nop
- 00EC 0008 000422 return
- 00ED 000423
-
-
- Used Symbols
- -----------------------------------------
- W 00000000
- F 00000001
- INDF 00000000
- TMR0 00000001
- PCL 00000002
- STATUS 00000003
- FSR 00000004
- PORTA 00000005
- PORTB 00000006
- PCLATH 0000000A
- INTCON 0000000B
- OPTION_REG 00000081
- TRISA 00000085
- TRISB 00000086
- GIE 00000007
- T0IE 00000005
- INTE 00000004
- RBIE 00000003
- T0IF 00000002
- INTF 00000001
- RBIF 00000000
- NOT_RBPU 00000007
- INTEDG 00000006
- T0CS 00000005
- T0SE 00000004
- PSA 00000003
- PS2 00000002
- PS1 00000001
- PS0 00000000
- IRP 00000007
- RP1 00000006
- RP0 00000005
- NOT_TO 00000004
- NOT_PD 00000003
- Z 00000002
- DC 00000001
- C 00000000
- EEDATA 00000008
- EEADR 00000009
- EECON1 00000088
- EECON2 00000089
- RA 00000005
- count0 0000000C
- count1 0000000D
- Akeydat 0000000E
- serbuf 0000000F
- rawkeys 00000005
- Reset 00000088
- check 00000089
- dat 00000092
- ready 0000009F
- rcAdat 000000A0
- sync 000000B2
- wms 000000BA
- AHshake 000000C3
- wACLK 000000CD
- wACLK2 000000D3
- sendb 000000D6
- s_it 000000DC
- wbit 000000E7
-
-
- Used Defines
- -----------------------------------------
- ACLK PortA,0
- ADAT PortA,1
- TXD PortA,2
- c 3,0
- z 3,2
-
-
- PROGRAM MEMORY USAGE TABLE: '-' = not used 'X' = used
-
- 0000 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
- 0040 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
- 0080 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
- 00C0 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXX--- ----------------
- 0100 : ---------------- ---------------- ---------------- ----------------
- 0140 : ---------------- ---------------- ---------------- ----------------
- 0180 : ---------------- ---------------- ---------------- ----------------
- 01C0 : ---------------- ---------------- ---------------- ----------------
- 0200 : ---------------- ---------------- ---------------- ----------------
- 0240 : ---------------- ---------------- ---------------- ----------------
- 0280 : ---------------- ---------------- ---------------- ----------------
- 02C0 : ---------------- ---------------- ---------------- ----------------
- 0300 : ---------------- ---------------- ---------------- ----------------
- 0340 : ---------------- ---------------- ---------------- ----------------
- 0380 : ---------------- ---------------- ---------------- ----------------
- 03C0 : ---------------- ---------------- ---------------- ----------------
-
- Program Memory Words Used: 0237
- Program Memory Words Free: 0787
-
- Errors: 0
-